/*
  棋盘问题
  题目描述
    设有一个 N * M 方格的棋盘（1 <= N <= 100, 1 <= M <= 100）,
    求出该棋盘中包含有多少个正方形、多少个长方形（不包括正方形）。
  输入描述
    一行，两个整数 N，M。
  输出描述
    一行两个整数，表示正方形的个数与长方形的个数。
  样例1
    输入
      2 3
    输出
      8 10
  提示
    1 <= N <= 100, 1 <= M <= 100

    例如：当 N = 2，M = 3 时：
            ┌───┬───┬───┐
            │   │   │   │
            ├───┼───┼───┤
            │   │   │   │
            └───┴───┴───┘
      正方形的个数有 8 个：
        边长为 1 的正方形有 6 个；
        边长为 2 的正方形有 2 个。
      长方形的个数有10个。即
        2 * 1 的长方形有 4 个：
            ┌───┬───┐
            │   │   │
            └───┴───┘
        1 * 2 的长方形有 3 个：
            ┌───┐
            │   │
            ├───┤
            │   │
            └───┘
        3 * 1 的长方形有 2 个：
            ┌───┬───┬───┐
            │   │   │   │
            └───┴───┴───┘
        3 * 2 的长方形有 1 个：
            ┌───┬───┬───┐
            │   │   │   │
            ├───┼───┼───┤
            │   │   │   │
            └───┴───┴───┘
*/
#include <iostream>

using namespace std;

int main() {
    int n, m;

    // c1记录正方形个数
    // c2记录长方形个数
    int c1 = 0, c2 = 0;

    cin >> n >> m;

    // 按横、纵坐标递增顺序，枚举任意对角线的两点组合
    // 利用两点横坐标之差与两点纵坐标之差比对，确定是正方形还是长方形
    for (int i = 0; i <= m; i++) {
        for (int j = 0; j <= n; j++) {
            for (int k = i + 1; i <= m ; k++) {
                for (int g = j + 1; g <= n; g++) {
                    if (k - i == g - j) {
                        c1++;
                    } else {
                        c2++;
                    }
                }
            }
        }
    }

    cout << c1 << " " << c2 << endl;
    return 0;
}